#pragma once

#include <Base/Definitions.h>

class _MainWindow;
using MainWindow = std::shared_ptr<_MainWindow>;

class SimulationView;

class _Shader;
using Shader = std::shared_ptr<_Shader>;

class _SimulationScrollbars;
using SimulationScrollbars = std::shared_ptr<_SimulationScrollbars>;

class Viewport;

class StyleRepository;

class TemporalControlWindow;

class SpatialControlWindow;

class SimulationParametersMainWindow;

class StatisticsWindow;

class SimulationInteractionController;

class GpuSettingsDialog;

class NewSimulationDialog;

class MainLoopController;

class ExitDialog;

class AboutDialog;

class MassOperationsDialog;

class LogWindow;

class _GuiLogger;
using GuiLogger = std::shared_ptr<_GuiLogger>;

class UiController;

class GettingStartedWindow;

class DisplaySettingsDialog;

class EditorModel;

class EditorController;

class SelectionWindow;

class PatternEditorWindow;

class WindowController;

class ResizeWorldDialog;

class _InspectorWindow;
using InspectorWindow = std::shared_ptr<_InspectorWindow>;

class CreatorWindow;

class MultiplierWindow;

class FpsController;

class BrowserWindow;

class LoginDialog;

class UploadSimulationDialog;

class EditSimulationDialog;

class CreateUserDialog;

class ActivateUserDialog;

class DeleteUserDialog;

class NetworkSettingsDialog;

class ResetPasswordDialog;

class NewPasswordDialog;

class ImageToPatternDialog;

class RadiationSourcesWindow;

class ChangeColorDialog;

class AutosaveWindow;

class GenomeEditorWindow;

class FileTransferController;

class _LocationWidget;
using LocationWidget = std::shared_ptr<_LocationWidget>;

class _GenomeTabWidget;
using GenomeTabWidget = std::shared_ptr<_GenomeTabWidget>;

struct _GenomeTabLayoutData;
using GenomeTabLayoutData = std::shared_ptr<_GenomeTabLayoutData>;

struct _GenomeWindowEditData;
using GenomeWindowEditData = std::shared_ptr<_GenomeWindowEditData>;

struct _GenomeTabEditData;
using GenomeTabEditData = std::shared_ptr<_GenomeTabEditData>;

class _GenomeEditorWidget;
using GenomeEditorWidget = std::shared_ptr<_GenomeEditorWidget>;

class _GeneEditorWidget;
using GeneEditorWidget = std::shared_ptr<_GeneEditorWidget>;

class _NodeEditorWidget;
using NodeEditorWidget = std::shared_ptr<_NodeEditorWidget>;

class _NeuralNetEditorWidget;
using NeuralNetEditorWidget = std::shared_ptr<_NeuralNetEditorWidget>;

class _PreviewWidget;
using PreviewWidget = std::shared_ptr<_PreviewWidget>;

class _CreaturePreviewWidget;
using CreaturePreviewWidget = std::shared_ptr<_CreaturePreviewWidget>;

struct UserInfo;

struct GLFWvidmode;
struct GLFWwindow;
struct ImFont;
struct ImVec2;

struct TextureData
{
    unsigned int textureId;
    int width;
    int height;
};

class _RenderPipeline;
using RenderPipeline = std::shared_ptr<_RenderPipeline>;

class _RenderStep;
using RenderStep = std::shared_ptr<_RenderStep>;

class _CellRenderStep;
using CellRenderStep = std::shared_ptr<_CellRenderStep>;

class _LineRenderStep;
using LineRenderStep = std::shared_ptr<_LineRenderStep>;

class _TriangleRenderStep;
using TriangleRenderStep = std::shared_ptr<_TriangleRenderStep>;

class _PostProcessingRenderStep;
using PostProcessingRenderStep = std::shared_ptr<_PostProcessingRenderStep>;

class _ForwardRenderStep;
using ForwardRenderStep = std::shared_ptr<_ForwardRenderStep>;

class _EnergyParticleRenderStep;
using EnergyParticleRenderStep = std::shared_ptr<_EnergyParticleRenderStep>;

class _LocationRenderStep;
using LocationRenderStep = std::shared_ptr<_LocationRenderStep>;

class _SelectedObjectRenderStep;
using SelectedObjectRenderStep = std::shared_ptr<_SelectedObjectRenderStep>;

class _CellTypeOverlayRenderStep;
using CellTypeOverlayRenderStep = std::shared_ptr<_CellTypeOverlayRenderStep>;

class _SelectedConnectionRenderStep;
using SelectedConnectionRenderStep = std::shared_ptr<_SelectedConnectionRenderStep>;

class _AttackEventRenderStep;
using AttackEventRenderStep = std::shared_ptr<_AttackEventRenderStep>;
class _DetonationEventRenderStep;
using DetonationEventRenderStep = std::shared_ptr<_DetonationEventRenderStep>;

class _TextureTarget;
using TextureTarget = std::shared_ptr<_TextureTarget>;

struct GeneralRenderInfo;
